home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Tool Chest / Text / WASTE / WASTE 1.1.2 Distribution / WASTE Source / Metrowerks specific / LongCoords⁄Utilities / WEUtilities.p < prev    next >
Encoding:
Text File  |  1995-10-12  |  6.3 KB  |  283 lines  |  [TEXT/CWIE]

  1. unit WEUtilities;
  2.  
  3. { WASTE PROJECT }
  4. { Utility Routines }
  5.  
  6. { Copyright © 1993-1995 Marco Piovanelli }
  7. { All Rights Reserved }
  8.  
  9. interface
  10.     uses
  11.         Types, Memory;
  12.  
  13.     const
  14.  
  15. { result codes }
  16.  
  17.         weUndefinedSelectorErr = -50;
  18.         
  19. { values for WEAllocate allocFlags parameter }
  20.  
  21.         kAllocClear = $0001;                        { clear handle after allocation }
  22.         kAllocTemp = $0002;                    { use temporary memory if available }
  23.  
  24.     type
  25.  
  26.     WEFieldDescriptor = record
  27.             fOffset: Integer;
  28.             fLength: Integer;
  29.         end;  { WEFieldDescriptor }
  30.  
  31.     WELookupTableElement = record
  32.             selector: LongInt;
  33.             desc: WEFieldDescriptor;
  34.         end;  { WELookupTableElement }
  35.     WELookupTableElementPtr = ^WELookupTableElement;
  36.     
  37.     WELookupTable = array[0..0] of WELookupTableElement;
  38.  
  39.     var
  40.  
  41. { externally defined global variables }
  42.  
  43. {$PUSH}
  44. {$J+}
  45.  
  46.         _weMainSelectorTable: WELookupTable;
  47.         _weObjectHandlerSelectorTable: WELookupTable;
  48.  
  49. {$POP}
  50.  
  51.     procedure _WEForgetHandle (var h: univ Handle);
  52.     function _WESetHandleLock (h: univ Handle;
  53.                                     lock: Boolean): Boolean;
  54.     procedure _WEBlockClr (blockPtr: Ptr;
  55.                                     blockSize: Size);
  56.     function _WEBlockCmp (block1, block2: Ptr;
  57.                                     blockSize: Size): Boolean;
  58.     function _WEInsertSlot (h: univ Handle;
  59.                                     element: univ Ptr;
  60.                                     insertAt: LongInt;
  61.                                     slotSize: Size): OSErr;
  62.     function _WERemoveSlot (h: univ Handle;
  63.                                     removeAt: LongInt;
  64.                                     slotSize: Size): OSErr;
  65.     procedure _WEReorder (var a, b: LongInt);
  66.     function _WEGetField ({const} var table: WELookupTable;
  67.                                     selector: OSType;
  68.                                     info: univ Ptr;
  69.                                     structure: univ Ptr): OSErr;
  70.     function _WESetField ({const} var table: WELookupTable;
  71.                                     selector: OSType;
  72.                                     info: univ Ptr;
  73.                                     structure: univ Ptr): OSErr;
  74.  
  75. implementation
  76.     
  77.     procedure _WEReorder(var a,b: LongInt);
  78.     var
  79.         temp: LongInt;
  80.     begin
  81.         if (a > b) then
  82.             begin
  83.                 temp := a;
  84.                 a := b;
  85.                 b := temp;
  86.             end;
  87.     end;  { _WEReorder }
  88.  
  89.     procedure _WEForgetHandle(var h: univ Handle);
  90.     var
  91.         theHandle: Handle;
  92.     begin
  93.         theHandle := h;
  94.         if (theHandle <> nil) then
  95.             begin
  96.                 h := nil;
  97.                 DisposeHandle(theHandle);
  98.             end;
  99.     end;  { _WEForgetHandle }
  100.     
  101.     function _WESetHandleLock(h: univ Handle; lock: Boolean): Boolean;
  102.     var
  103.         oldLock: Boolean;
  104.     begin
  105.  
  106. { get current lock status (lock bit is the high bit of the handle state byte) }
  107.         oldLock := (HGetState(h) < 0);
  108.  
  109. { lock or unlock the handle if necessary }
  110.         if (oldLock <> lock) then
  111.             if (lock) then
  112.                 HLock(h)
  113.             else
  114.                 HUnlock(h);
  115.  
  116. { return previous lock status }
  117.         _WESetHandleLock := oldLock;
  118.  
  119.     end;  { _WESetHandleLock }
  120.     
  121.     procedure _WEBlockClr(blockPtr: Ptr; blockSize: Size);
  122.     begin
  123.         while (blockSize > 0) do
  124.             begin
  125.                 blockPtr^ := 0;
  126.                 blockPtr := Ptr(LongInt(blockPtr) + 1);
  127.                 blockSize := blockSize - 1;
  128.             end;  { while }
  129.     end;  { _WEBlockClr }
  130.  
  131.     function _WEBlockCmp(block1, block2: Ptr; blockSize: Size): Boolean;
  132.     begin
  133.         _WEBlockCmp := false;
  134.         while (blockSize > 0) do
  135.             begin
  136.                 if (block1^ <> block2^) then
  137.                     Exit(_WEBlockCmp);
  138.                 block1 := Ptr(LongInt(block1) + 1);
  139.                 block2 := Ptr(LongInt(block2) + 1);
  140.                 blockSize := blockSize - 1;
  141.             end;  { while }
  142.         _WEBlockCmp := true;
  143.     end;  { _WEBlockCmp }
  144.  
  145.     function _WEInsertSlot (h: univ Handle;
  146.                                     element: univ Ptr;
  147.                                     insertAt: LongInt;
  148.                                     slotSize: Size): OSErr;
  149.     label
  150.         1;
  151.     var
  152.         oldSize: Size;
  153.         offset: LongInt;
  154.         err: OSErr;
  155.     begin
  156.  
  157. { get handle size }
  158.     oldSize := InlineGetHandleSize(h);
  159.  
  160. { lengthen handle by one "slot" }
  161.     SetHandleSize(h, oldSize + slotSize);
  162.     err := MemError;
  163.     if (err <> noErr) then
  164.         goto 1;
  165.  
  166. { calculate insertion offset }
  167.     offset := insertAt * slotSize;
  168.  
  169. { make sure offset is within allowed bounds }
  170.     err := -50;
  171.     if ((offset < 0) or (offset > oldSize)) then
  172.         goto 1;
  173.  
  174. { make room for new element }
  175.     BlockMoveData(Ptr(LongInt(h^) + offset), Ptr(LongInt(h^) + offset + slotSize), oldSize - offset);
  176.  
  177. { insert new element }
  178.     BlockMoveData(element, Ptr(LongInt(h^) + offset), slotSize);
  179.  
  180. { clear result code }
  181.     err := noErr;
  182.  
  183. 1:
  184. { return result code }
  185.     _WEInsertSlot := err;
  186.     
  187. end;  { _WEInsertSlot }
  188.  
  189. function _WERemoveSlot (h: univ Handle;
  190.                                 removeAt: LongInt;
  191.                                 slotSize: Size): OSErr;
  192. label
  193.     1;
  194. var
  195.     newSize: Size;
  196.     offset: LongInt;
  197.     err: OSErr;
  198. begin
  199.  
  200. { get handle size minus a "slot" }
  201.     newSize := InlineGetHandleSize(h) - slotSize;
  202.  
  203. { calculate removal offset }
  204.     offset := removeAt * slotSize;
  205.  
  206. { make sure offset is within allowed bounds }
  207.     err := -50;
  208.     if ((offset < 0) or (offset > newSize)) then
  209.         goto 1;
  210.  
  211. { compact the array }
  212.     BlockMoveData(Ptr(LongInt(h^) + offset + slotSize), Ptr(LongInt(h^) + offset), newSize - offset );
  213.  
  214. { shorten the handle }
  215.     SetHandleSize(h, newSize);
  216.     err := MemError;
  217.     if (err <> noErr) then
  218.         goto 1;
  219.  
  220. { clear result code }
  221.     err := noErr;
  222.  
  223. 1:
  224. { return result code }
  225.     _WERemoveSlot := err;
  226.  
  227. end;  { _WERemoveSlot }
  228.  
  229.     procedure _WELookupSelector(pTable: WELookupTableElementPtr; selector: LongInt; var desc: WEFieldDescriptor);
  230.     begin
  231.         while (pTable^.selector <> selector) do
  232.             begin
  233.                 if (pTable^.desc.fLength = 0) then
  234.                     Leave;
  235.                 pTable := WELookupTableElementPtr(LongInt(pTable) + SizeOf(WELookupTableElement));
  236.             end;  { while }
  237.         
  238.         desc := pTable^.desc;
  239.     end;  { _WELookupSelector }
  240.  
  241.     function _WEGetField ({const} var table: WELookupTable;
  242.                                     selector: OSType;
  243.                                     info: univ Ptr;
  244.                                     structure: univ Ptr): OSErr;
  245.     var
  246.         desc: WEFieldDescriptor;
  247.     begin
  248.         _WEGetField := noErr;
  249.  
  250. { look up in the specified look-up table the field descriptor }
  251. { corresponding to the given selector }
  252.         _WELookupSelector(@table, LongInt(selector), desc);
  253.  
  254. { return an error code if the selector isn't defined }
  255.         if (desc.fLength = 0) then
  256.             _WEGetField := weUndefinedSelectorErr
  257.         else
  258.             LongIntPtr(info)^ := LongIntPtr(LongInt(structure) + desc.fOffset)^;
  259.         
  260.     end;  { _WEGetField }
  261.     
  262.     function _WESetField ({const} var table: WELookupTable;
  263.                                     selector: OSType;
  264.                                     info: univ Ptr;
  265.                                     structure: univ Ptr): OSErr;
  266.     var
  267.         desc: WEFieldDescriptor;
  268.     begin
  269.         _WESetField := noErr;
  270.  
  271. { look up in the specified look-up table the field descriptor }
  272. { corresponding to the given selector }
  273.         _WELookupSelector(@table, LongInt(selector), desc);
  274.  
  275. { return an error code if the selector isn't defined }
  276.         if (desc.fLength = 0) then
  277.             _WESetField := weUndefinedSelectorErr
  278.         else
  279.             LongIntPtr(LongInt(structure) + desc.fOffset)^ := LongIntPtr(info)^;
  280.         
  281.     end;  { _WESetField }
  282.     
  283. end.